﻿/**
 @file Dbc.h
 @brief CLite_Dbc 헤더 파일.
*/

/**
 @class  CLite_Dbc
 @date   2012/03/01
 @author 김영욱
 @brief  연결을 담당하는 DB Class
*/

#pragma once
class CLite_Stmt;
class CLite_Dbc
{
public:
	CLite_Dbc(const int nMyIndex);  ///< 기본 생성자.
	~CLite_Dbc(void);               ///< 기본 소멸자.
public:
	BOOL ConnectDB(char *pIP, int nPort, int nTimeout,int nRetry, char *pUID, char * pPWD); ///< 서버와 연결 함수.
	void DisconnectDB(); ///< 서버와 연결을 해제 하는 함수.

	CLite_Stmt * CreateStmt(); ///< STMT Class 생성.
	void  DeleteStmt(CLite_Stmt *pStmt); ///< STMT Class 소멸.
	BOOL WriteReadSock( const short nIndex, const short nItem, const short nStat,
						  const short nReply, const short nDataLen, const char *pszData); ///< 데이터를 주고 받는 함수.
	BOOL Exec_v2(const char * pszSQL);
	
	void SetErr(const char * pErr); ///< 에러 메시지 설정 함수.
	const char * GetErr();          ///< 에러 문자열 리턴.
	BOOL IsConnected();            ///< 서버와 연결이 되어 있는지 검사.
	
private:
	BOOL TryConnect(); ///< 연결 시도 함수.
	BOOL TryLogIn();   ///< 로그인 시도 함수.

	BOOL  SEND(SOCKET sock, char * buf, const int nBufSize); ///< 데이터 서버 전송 함수.                            
	BOOL  RECV(SOCKET sock, char * buf, const int nBufSize); ///< 데이터 서버 수신 함수.                           

private:
	char   m_szErr[50];    ///< 에러 메시지.
	SOCKET m_sock;         ///< 서버와의 연결 소켓.
	PACKET_STRT   m_Pack;  ///< 소켓 전송 패킷.
	int m_nMyIndex;        ///< 자신의 인덱스.
	
	CLite_Stmt * m_pStmt[STMT_COUNT]; ///< SQL 실행객체 Class 배열 변수.
	
	char m_szIP[30];  ///< 접속 IP.
	int  m_nPort;     ///< 접속 Port.
	int  m_nTimeout;  ///< 접속 TimeOut.
	int  m_nRetry;    ///< 접속 Retry.
	
	char m_szUID[30]; ///< User ID.
	char m_szPWD[30]; ///< User Password.
	int  m_nAuth;     ///< 권한.
};
